package tools

import (
	"bufio"
	"encoding/json"
	"os"
)

// SmsConfig 阿里云短信平台参数信息
type SmsConfig struct {
	SignName     string `json:"sign_name"`
	TemplateCode string `json:"template_code"`
	AccessKeyId  string `json:"access_key_id"`
	AccessSecret string `json:"access_secret"`
	RegionId     string `json:"region_id"`
}

// DatabaseConfig 数据库配置信息
type DatabaseConfig struct {
	Driver   string `json:"driver"`
	Username string `json:"username"`
	Password string `json:"password"`
	Host     string `json:"host"`
	Port     string `json:"port"`
	DbName   string `json:"db_name"`
	Charset  string `json:"charset"`
	ShowSQL  bool   `json:"show_sql"`
}

// RedisConfig redis配置
type RedisConfig struct {
	Addr     string `json:"addr"`
	Port     string `json:"port"`
	Password string `json:"password"`
	Db       int    `json:"db"`
}

// Config 读出`./config/app.json`内容实现结构体
type Config struct {
	// tag指定json
	AppName     string         `json:"app_name"`
	AppMode     string         `json:"app_mode"`
	AppProtocol string         `json:"app_protocol"`
	AppHost     string         `json:"app_host"`
	AppPort     string         `json:"app_port"`
	Sms         SmsConfig      `json:"sms"`
	Database    DatabaseConfig `json:"database"`
	Redis       RedisConfig    `json:"redis"`
}

var _conf *Config = nil

// ParseConfig 解析config配置文件
func ParseConfig(path string) (*Config, error) {
	file, err := os.Open(path)
	if err != nil {
		panic(err)
	}
	defer file.Close()

	reader := bufio.NewReader(file)
	decoder := json.NewDecoder(reader)
	if err := decoder.Decode(&_conf); err != nil {
		return nil, err
	}
	return _conf, nil
}

// GetConfig 由于在main.go 已经解析了一遍，再别的地方通过此函数获取该变量即可
func GetConfig() *Config {
	return _conf
}
